home *** CD-ROM | disk | FTP | other *** search
- static char rcsid[] = "$Header: unit_gen.c,v 1.7 91/02/13 09:46:41 mara Exp $";
-
- /* unit_gen.c
- *
- * Written by Mara Helmuth
- *
- * Description: unit_generator class for cmix X graphical interface
- *
- * $Log: unit_gen.c,v $
- * Revision 1.7 91/02/13 09:46:41 mara
- * panel fixes
- *
- * Revision 1.6 90/10/11 10:32:00 mara
- * am fix
- *
- * Revision 1.5 90/09/08 12:49:54 mara
- * side panel for input amps
- *
- * Revision 1.4 90/09/07 20:50:46 mara
- * fm
- *
- * Revision 1.3 90/09/05 22:10:53 mara
- * many fixes, +,-,*,/ ugens added
- *
- * Revision 1.2 90/09/02 18:19:25 mara
- * NeXT fixes
- *
- * Revision 1.1 90/08/27 17:09:50 mara
- * Initial revision
- *
- */
-
- #include "plus.h"
-
- unit_generator::unit_generator()
- {
- sprintf(file,"Newinst/%s.c",inst.name);
- fp = fopen(file, "a");
- if(!fp)
- perror(file);
- beg_int = inst.num_ints;
- beg_float = inst.num_sfloats;
- beg_float_ptr = inst.num_float_ptrs;
- }
-
- void unit_generator::write_oscil(int p, int l, int r)
- {
- // create instrument variables
-
- sprintf(inst.ints[inst.num_ints++],"len%d",p);
- sprintf(inst.ints[inst.num_ints++],"wave%d",p);
-
- sprintf(inst.sfloats[inst.num_sfloats++],"ug%d",p); // 0
- sprintf(inst.sfloats[inst.num_sfloats++],"amp%d",p); // 1
- sprintf(inst.sfloats[inst.num_sfloats++],"si%d",p); // 2
- sprintf(inst.sfloats[inst.num_sfloats++],"phase%d",p); // 3
-
- sprintf(inst.float_ptrs[inst.num_float_ptrs++],"f%d",p);
-
- strcpy(oscil_type,"oscili");
- sprintf(amp_var,"%s",inst.sfloats[beg_float+1]);
- sprintf(si_var,"%s",inst.sfloats[beg_float + 2]);
-
- // create instrument commands
- sprintf(cmd,"%s = 1;\n",inst.ints[beg_int+1]); // wave
- inst.cmd_list.append(cmd);
- if(l > 0) { // there is an input ugen to amplitude - ring mod
- sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
- atof(ugen[p].oscil->amp->value));
- // amp? = ?;
- inst.loop_list.append(cmd);
-
- sprintf(amp_var,"ampam%d",p);
- strcpy(inst.sfloats[inst.num_sfloats++],amp_var);
- sprintf(cmd,"%s = %s * ug%d;\n",amp_var,
- inst.sfloats[beg_float+1],l);
- inst.loop_list.append(cmd);
- }
- else if(l < 0) // amp is a pfield for this oscil
- ;
- else { // amp is preset or default
- sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
- atof(ugen[p].oscil->amp->value));
- inst.loop_list.append(cmd);
- }
- if(r < 0) { // oscil.freq is not set--make a pfield
- inst.pfield++;
- sprintf(cmd,"%s = p[%d]*fsize(1)/SR;\n",
- inst.sfloats[beg_float+2], inst.pfield);
- inst.p[inst.pfield] = 260;
- }
- else if(r == 0) { // oscil.freq is preset
- sprintf(cmd,"%s = %.2f*fsize(1)/SR;\n",inst.sfloats[beg_float+2], atof(ugen[p].oscil->freq->value));
- }
- else {
- printf("fm selected\n");
- strcpy(oscil_type,"oscilni");
- sprintf(si_var,"sifm%d",p);
- strcpy(inst.sfloats[inst.num_sfloats++],si_var);
-
- sprintf(cmd,"%s = si%d + ug%d * len%d/SR;\n", si_var,p,r,p);
- inst.loop_list.append(cmd);
- sprintf(cmd,"si%d = %.2f*fsize(1)/SR;\n",p,
- atof(ugen[p].oscil->freq->value),p);
- }
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = 0.;\n",inst.sfloats[beg_float+3]);
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = fsize(%s);\n",inst.ints[beg_int],inst.ints[beg_int+1]);
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = (float *)floc(%s);\n",inst.float_ptrs[beg_float_ptr],inst.ints[beg_int+1]);
- inst.cmd_list.append(cmd);
-
- sprintf(cmd, "%s = %s(%s,%s,%s,%s,&%s);\n",inst.sfloats[beg_float], \
- oscil_type,amp_var,si_var,\
- inst.float_ptrs[beg_float_ptr],inst.ints[beg_int], \
- inst.sfloats[beg_float+3]);
- inst.loop_list.append(cmd);
-
- // declare instrument variables
-
-
- declare(beg_int, beg_float, beg_float_ptr);
- }
-
- void unit_generator::write_evp(int p, int l, int r)
- {
- // create instrument variables
-
- sprintf(inst.ints[inst.num_ints++],"nfrise%d",p);
-
- sprintf(inst.sfloats[inst.num_sfloats++],"ug%d",p); // 0
- sprintf(inst.sfloats[inst.num_sfloats++],"amp%d",p); // 1
- sprintf(inst.sfloats[inst.num_sfloats++],"dur%d",p); // 2
- sprintf(inst.sfloats[inst.num_sfloats++],"rise%d",p); // 3
- sprintf(inst.sfloats[inst.num_sfloats++],"decay%d",p); // 4
- sprintf(inst.sfloats[inst.num_sfloats++],"q%d",p); // 5
- // q[9] should be declared, q used in evset
-
- sprintf(inst.float_ptrs[inst.num_float_ptrs++],"f1_%d",p);
- sprintf(inst.float_ptrs[inst.num_float_ptrs++],"f2_%d",p);
-
- // create instrument commands
-
- sprintf(cmd,"%s = %f;\n",inst.sfloats[beg_float+1],atof(ugen[p].evp->amp->value));
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = %d;\n",inst.ints[beg_int],atoi(ugen[p].evp->nfunc->value)+2); // function for rise (& decay)
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = %f;\n",inst.sfloats[beg_float+3],atof(ugen[p].evp->rise->value));
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = %f;\n",inst.sfloats[beg_float+4],atof(ugen[p].evp->decay->value));
- inst.cmd_list.append(cmd);
- sprintf(cmd,"evset(p[1],%s,%s,%s,%s);\n",inst.sfloats[beg_float+3],inst.sfloats[beg_float+4],inst.ints[beg_int],inst.sfloats[beg_float+5]);
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = (float *)floc(%s);\n",inst.float_ptrs[beg_float_ptr],inst.ints[beg_int]);
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = %s;\n",inst.float_ptrs[beg_float_ptr+1],inst.float_ptrs[beg_float_ptr]);
- inst.cmd_list.append(cmd);
-
- if(l > 0) { // there is an input ugen to amplitude
- /*
- sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
- atof(ugen[p].evp->amp->value));
- // amp? = ?;
- inst.loop_list.append(cmd);
-
- sprintf(amp_var,"ampam%d",p);
- sprintf(cmd,"%s = %s * ug%d;\n",inst.sfloats[beg_float],
- inst.sfloats[beg_float+1],l);
- inst.loop_list.append(cmd);
- */
- }
- else if(l < 0) // amp is a pfield for this evp
- ;
- else { // amp is preset or default
- sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float],
- atof(ugen[p].evp->amp->value));
- inst.loop_list.append(cmd);
- }
- if(r < 0) {
- }
- /*
- else if(r == 0) { // evp.rise is preset
- sprintf(cmd,"%s = %.3f;\n",inst.sfloats[beg_float+2], atof(ugen[p].evp->rise->value));
- }
- */
- inst.cmd_list.append(cmd);
-
- sprintf(cmd, "%s = evp(i,%s,%s,%s);\n",inst.sfloats[beg_float], \
- inst.float_ptrs[beg_float_ptr], \
- inst.float_ptrs[beg_float_ptr+1], inst.sfloats[beg_float+5]);
- inst.loop_list.append(cmd);
-
- // declare instrument variables
-
-
- strcat(inst.sfloats[beg_float+5],"[9]"); // for array declaration
- declare(beg_int, beg_float, beg_float_ptr);
- }
-
- void unit_generator::write_buzz(int p, int l, int r)
- {
- char buzz_type[20];
- // create instrument variables
-
- sprintf(inst.ints[inst.num_ints++],"wave%d",p);
-
- sprintf(inst.sfloats[inst.num_sfloats++],"ug%d",p); // 0
- sprintf(inst.sfloats[inst.num_sfloats++],"amp%d",p); // 1
- sprintf(inst.sfloats[inst.num_sfloats++],"si%d",p); // 2
- sprintf(inst.sfloats[inst.num_sfloats++],"nhar%d",p); // 3
- sprintf(inst.sfloats[inst.num_sfloats++],"phase%d",p); // 4
-
- sprintf(inst.float_ptrs[inst.num_float_ptrs++],"f%d",p); //farray
-
- strcpy(buzz_type,"buzz");
- sprintf(amp_var,"%s",inst.sfloats[beg_float+1]);
- sprintf(si_var,"%s",inst.sfloats[beg_float + 2]);
-
- // create instrument commands
- sprintf(cmd,"%s = 1;\n",inst.ints[beg_int]); // wave
- inst.cmd_list.append(cmd);
- if(l > 0) { // there is an input ugen to amplitude
- sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
- atof(ugen[p].buzz->amp->value));
- // amp? = ?;
- inst.loop_list.append(cmd);
-
- sprintf(amp_var,"ampam%d",p);
- strcpy(inst.sfloats[inst.num_sfloats++],amp_var);
- sprintf(cmd,"%s = %s * ug%d;\n",amp_var,
- inst.sfloats[beg_float+1],l);
- inst.loop_list.append(cmd);
- }
- else if(l < 0) // amp is a pfield for this buzz
- ;
- else { // amp is preset or default
- sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+1],
- atof(ugen[p].buzz->amp->value));
- inst.loop_list.append(cmd);
- }
- if(r < 0) { // buzz.freq is not set--make a pfield
- inst.pfield++;
- sprintf(cmd,"%s = p[%d]*fsize(1)/SR;\n",
- inst.sfloats[beg_float+2], inst.pfield);
- inst.p[inst.pfield] = 260;
- }
- else if(r == 0) { // buzz.freq is preset
- sprintf(cmd,"%s = %.2f*fsize(1)/SR;\n",inst.sfloats[beg_float+2], atof(ugen[p].buzz->freq->value));
- }
- else {
- printf("fm selected - doesn't work\n");
- }
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = 0.;\n",inst.sfloats[beg_float+4]); // phase
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = (float *)floc(%s);\n",inst.float_ptrs[beg_float_ptr],inst.ints[beg_int]);
- inst.cmd_list.append(cmd);
- sprintf(cmd,"%s = %.2f;\n",inst.sfloats[beg_float+3],
- atof(ugen[p].buzz->nhar->value));
- inst.cmd_list.append(cmd);
-
- sprintf(cmd, "%s = %s(%s,%s,%s,%s,&%s);\n",inst.sfloats[beg_float], \
- buzz_type,amp_var,si_var, inst.sfloats[beg_float+3], \
- inst.float_ptrs[beg_float_ptr], inst.sfloats[beg_float+4]);
- inst.loop_list.append(cmd);
-
- // declare instrument variables
-
-
- declare(beg_int, beg_float, beg_float_ptr);
- }
-
- void unit_generator::write_add(int p, int l, int r)
- {
- fprintf(fp, "\tfloat ug%d;\n",p);
- declare(beg_int, beg_float, beg_float_ptr);
- float l_fact, r_fact;
- l_fact = atof(ugen[p].side->in0->value);
- r_fact = atof(ugen[p].side->in1->value);
- if(l && r)
- sprintf(cmd, "ug%d = %f * ug%d + %f * ug%d;\n",
- p, l_fact, l, r_fact, r);
- else if(l)
- sprintf(cmd, "ug%d = %f * ug%d;\n", p, l_fact, l);
- else if(r)
- sprintf(cmd, "ug%d = %f * ug%d;\n", p, r_fact, r);
- else
- sprintf(cmd, "ug%d = 0.;\n", p);
- inst.loop_list.append(cmd);
- }
-
- void unit_generator::write_rand(int p, int l, int r)
- {
- fprintf(fp, "\tfloat ug%d;\n",p);
- declare(beg_int, beg_float, beg_float_ptr);
- sprintf(cmd, "ug%d = rrand();\n", p);
- inst.loop_list.append(cmd);
- }
-
- void unit_generator::write_sub(int p, int l, int r)
- {
- fprintf(fp, "\tfloat ug%d;\n",p);
- declare(beg_int, beg_float, beg_float_ptr);
- float l_fact, r_fact;
- l_fact = atof(ugen[p].side->in0->value);
- r_fact = atof(ugen[p].side->in1->value);
- if(l && r)
- sprintf(cmd, "ug%d = %f * ug%d - %f * ug%d;\n",
- p, l_fact, l, r_fact, r);
- else if(l)
- sprintf(cmd, "ug%d = %f * ug%d - %f;\n", p, l_fact, l, r_fact);
- else if(r)
- sprintf(cmd, "ug%d = %f - %f * ug%d;\n", p, l_fact, r_fact, r);
- else
- sprintf(cmd, "ug%d = 0.;\n", p);
- inst.loop_list.append(cmd);
- }
-
- void unit_generator::write_mult(int p, int l, int r)
- {
- fprintf(fp, "\tfloat ug%d;\n",p);
- declare(beg_int, beg_float, beg_float_ptr);
- float l_fact, r_fact;
- l_fact = atof(ugen[p].side->in0->value);
- r_fact = atof(ugen[p].side->in1->value);
- if(l && r)
- sprintf(cmd, "ug%d = %f * ug%d * %f * ug%d;\n",
- p, l_fact, l, r_fact, r);
- else if(l)
- sprintf(cmd, "ug%d = %f * ug%d * %f;\n", p, l_fact, l, r_fact);
- else if(r)
- sprintf(cmd, "ug%d = %f * %f * ug%d;\n", p, l_fact, r_fact, r);
- else
- sprintf(cmd, "ug%d = 0.;\n", p);
- inst.loop_list.append(cmd);
- }
-
- void unit_generator::write_div(int p, int l, int r)
- {
- fprintf(fp, "\tfloat ug%d;\n",p);
- declare(beg_int, beg_float, beg_float_ptr);
- float l_fact, r_fact;
- l_fact = atof(ugen[p].side->in0->value);
- r_fact = atof(ugen[p].side->in1->value);
- if(l && r)
- sprintf(cmd, "ug%d = (%f * ug%d) / (%f * ug%d);\n",
- p, l_fact, l, r_fact, r);
- else if(l)
- sprintf(cmd, "ug%d = (%f * ug%d) / %f;\n", p, l_fact, l, r_fact);
- else if(r)
- sprintf(cmd, "ug%d = %f / (%f * ug%d);\n", p, l_fact, r_fact, r);
- else
- sprintf(cmd, "ug%d = 0.;\n", p);
- inst.loop_list.append(cmd);
- }
-
- void unit_generator::write_out(int p, int l, int r)
- {
- sprintf(cmd, "out[0] = ug%d;\n",l);
- inst.loop_list.append(cmd);
- // if mono
- sprintf(cmd, "out[1] = out[0];\n");
-
- inst.loop_list.append(cmd);
- }
-
- void unit_generator::declare(int in, int f, int p)
- {
- for(int i = in; i < inst.num_ints; i++)
- fprintf(fp,"\tint %s;\n",inst.ints[i]);
- for(i = f; i < inst.num_sfloats; i++)
- fprintf(fp,"\tfloat %s;\n",inst.sfloats[i]);
- for(i = p; i < inst.num_float_ptrs; i++)
- fprintf(fp,"\tfloat *%s;\n",inst.float_ptrs[i]);
- }
-
- unit_generator::~unit_generator()
- {
- fclose(fp);
- }
-
- //*****************************************************
-
- ugen_loc::ugen_loc(int type)
- {
- if(type < 20) {
- size = 75;
- xoffset = yoffset = 37;
- }
- else {
- size = 36;
- xoffset = yoffset = 18;
- }
- }
-
- int ugen_loc::get_size()
- {
- return size;
- }
-
- int ugen_loc::get_xoffset()
- {
- return xoffset;
- }
-
- int ugen_loc::get_yoffset()
- {
- return yoffset;
- }
-